# $Id: Makefile 9120 2006-08-28 13:01:07Z vlad $

all:
.PHONY: all kernel install_kernel install clean clean_kernel uninstall
.PHONY: install_kernel_iscsi uninstall_iscsi
.PHONY: install_kernel_cxgb3 uninstall_cxgb3
.PHONY: install_kernel_rds uninstall_rds
	
.DELETE_ON_ERROR:

include ./configure.mk.kernel

DEPMOD  = /sbin/depmod
	
ifeq ($(WITH_MEMTRACK),yes)
        export KERNEL_MEMTRACK_CFLAGS = -include $(CWD)/drivers/infiniband/debug/mtrack.h
else
        export KERNEL_MEMTRACK_CFLAGS =
endif

export OPEN_ISCSI_MODULES = iscsi_tcp.ko libiscsi.ko scsi_transport_iscsi.ko

configure.mk.kernel:
	@echo Please run ./configure
	@exit 1

all: kernel

install: install_kernel
install_kernel: install_modules

ifeq ($(CONFIG_INFINIBAND_ISER),m)
install_kernel:   install_kernel_iscsi
uninstall: uninstall_iscsi
endif

ifeq ($(CONFIG_CHELSIO_T3),m)
install_kernel: install_kernel_cxgb3
uninstall: uninstall_cxgb3
endif

ifeq ($(CONFIG_RDS),m)
install_kernel: install_kernel_rds
uninstall: uninstall_rds
endif

ifeq ($(CONFIG_INFINIBAND),m)
install_kernel:   install_kernel_infiniband
uninstall: uninstall_infiniband
endif

#########################
#	make kernel	#
#########################
#NB: The LINUXINCLUDE value comes from main kernel Makefile
#    with local directories prepended. This eventually affects
#    CPPFLAGS in the kernel Makefile
kernel:
	@echo "Building kernel modules"
	@echo "Kernel version: $(KVERSION)"
	@echo "Modules directory: $(DESTDIR)/$(MODULES_DIR)"
	@echo "Kernel sources: $(KSRC)"
	env EXTRA_CFLAGS="$(OPENIB_KERNEL_EXTRA_CFLAGS) $(KERNEL_MEMTRACK_CFLAGS) -I$(CWD)/include -I$(CWD)/drivers/infiniband/include \
		-I$(CWD)/drivers/infiniband/ulp/ipoib \
		-I$(CWD)/drivers/infiniband/debug \
		-I$(CWD)/drivers/infiniband/hw/cxgb3/core \
		-I$(CWD)/drivers/net/cxgb3 \
		-I$(CWD)/drivers/net/rds " \
    	$(MAKE) -C $(KSRC) SUBDIRS="$(CWD)" KERNELRELEASE=$(KVERSION) \
		EXTRAVERSION=$(EXTRAVERSION) V=1 $(WITH_MAKE_PARAMS) \
		CONFIG_INFINIBAND=$(CONFIG_INFINIBAND) \
		CONFIG_INFINIBAND_IPOIB=$(CONFIG_INFINIBAND_IPOIB) \
		CONFIG_INFINIBAND_IPOIB_CM=$(CONFIG_INFINIBAND_IPOIB_CM) \
		CONFIG_INFINIBAND_SDP=$(CONFIG_INFINIBAND_SDP) \
		CONFIG_INFINIBAND_SRP=$(CONFIG_INFINIBAND_SRP) \
		CONFIG_INFINIBAND_USER_MAD=$(CONFIG_INFINIBAND_USER_MAD) \
		CONFIG_INFINIBAND_USER_ACCESS=$(CONFIG_INFINIBAND_USER_ACCESS) \
		CONFIG_INFINIBAND_ADDR_TRANS=$(CONFIG_INFINIBAND_ADDR_TRANS) \
		CONFIG_INFINIBAND_MTHCA=$(CONFIG_INFINIBAND_MTHCA) \
		CONFIG_INFINIBAND_IPOIB_DEBUG=$(CONFIG_INFINIBAND_IPOIB_DEBUG) \
		CONFIG_INFINIBAND_ISER=$(CONFIG_INFINIBAND_ISER) \
        	CONFIG_SCSI_ISCSI_ATTRS=$(CONFIG_SCSI_ISCSI_ATTRS) \
        	CONFIG_ISCSI_TCP=$(CONFIG_ISCSI_TCP) \
		CONFIG_INFINIBAND_EHCA=$(CONFIG_INFINIBAND_EHCA) \
		CONFIG_INFINIBAND_EHCA_SCALING=$(CONFIG_INFINIBAND_EHCA_SCALING) \
		CONFIG_RDS=$(CONFIG_RDS) \
		CONFIG_RDS_IB=$(CONFIG_RDS_IB) \
		CONFIG_RDS_TCP=$(CONFIG_RDS_TCP) \
		CONFIG_RDS_DEBUG=$(CONFIG_RDS_DEBUG) \
		CONFIG_INFINIBAND_IPOIB_DEBUG_DATA=$(CONFIG_INFINIBAND_IPOIB_DEBUG_DATA) \
		CONFIG_INFINIBAND_SDP_SEND_ZCOPY=$(CONFIG_INFINIBAND_SDP_SEND_ZCOPY) \
		CONFIG_INFINIBAND_SDP_RECV_ZCOPY=$(CONFIG_INFINIBAND_SDP_RECV_ZCOPY) \
		CONFIG_INFINIBAND_SDP_DEBUG=$(CONFIG_INFINIBAND_SDP_DEBUG) \
		CONFIG_INFINIBAND_SDP_DEBUG_DATA=$(CONFIG_INFINIBAND_SDP_DEBUG_DATA) \
		CONFIG_INFINIBAND_IPATH=$(CONFIG_INFINIBAND_IPATH) \
		CONFIG_INFINIBAND_MTHCA_DEBUG=$(CONFIG_INFINIBAND_MTHCA_DEBUG) \
   		CONFIG_INFINIBAND_MADEYE=$(CONFIG_INFINIBAND_MADEYE) \
        	CONFIG_INFINIBAND_VNIC=$(CONFIG_INFINIBAND_VNIC) \
        	CONFIG_INFINIBAND_VNIC_DEBUG=$(CONFIG_INFINIBAND_VNIC_DEBUG) \
        	CONFIG_INFINIBAND_VNIC_STATS=$(CONFIG_INFINIBAND_VNIC_STATS) \
        	CONFIG_CHELSIO_T3=$(CONFIG_CHELSIO_T3) \
        	CONFIG_INFINIBAND_CXGB3=$(CONFIG_INFINIBAND_CXGB3) \
        	CONFIG_INFINIBAND_CXGB3_DEBUG=$(CONFIG_INFINIBAND_CXGB3_DEBUG) \
		LINUXINCLUDE=' \
		$(BACKPORT_INCLUDES) \
		-I$(CWD)/include \
		-I$(CWD)/drivers/infiniband/include \
		-Iinclude \
		$$(if $$(KBUILD_SRC),-Iinclude2 -I$$(srctree)/include) \
		-include include/linux/autoconf.h \
		-include $(CWD)/include/linux/autoconf.h \
		' \
		modules


#########################
#	Install kernel	#
#########################
install_modules: kernel
	@echo "Installing kernel modules"

	$(MAKE) -C $(KSRC) SUBDIRS="$(CWD)" \
		KERNELRELEASE=$(KVERSION) EXTRAVERSION=$(EXTRAVERSION) \
		INSTALL_MOD_PATH=$(CWD) \
		$(WITH_MAKE_PARAMS) modules_install;

install_kernel_infiniband: install_modules
	if [ -d $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband ]; then \
		mkdir -p $(DESTDIR)/$(prefix)/backup; \
		if [ ! -f $(DESTDIR)/$(prefix)/backup/infiniband_ko-$(KVERSION).tgz ]; then \
			/bin/rm -f $(DESTDIR)/$(prefix)/backup/infko_tmp.tgz; \
			tar czfP $(DESTDIR)/$(prefix)/backup/infko_tmp.tgz $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband; \
			mv $(DESTDIR)/$(prefix)/backup/infko_tmp.tgz $(DESTDIR)/$(prefix)/backup/infiniband_ko-$(KVERSION).tgz; \
		fi; \
		/bin/rm -rf $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband; \
	fi;

	# Copy new infiniband kernel modules to $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband
	if [ -d $(CWD)/lib/modules/$(KVERSION)/infiniband ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers; \
		mv $(CWD)/lib/modules/$(KVERSION)/infiniband $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/; \
	fi;
	if [ -d $(CWD)/lib/modules/$(KVERSION)/extra/drivers/infiniband ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra/drivers/infiniband $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/; \
	elif [ -d $(CWD)/lib/modules/$(KVERSION)/extra ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband; \
	fi;

	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

install_kernel_iscsi: install_modules
	# Backup original open-iscsi kernel modules
	# under 'prefix'/backup directory
	if [ -d $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi ]; then \
	        mkdir -p $(DESTDIR)/$(prefix)/backup; \
	        if [ ! -f $(DESTDIR)/$(prefix)/backup/open_iscsi_ko-$(KVERSION).tgz ]; then \
	                open_iscsi_mods_full_path=""; \
	                for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	                do \
	                        open_iscsi_mods_full_path="$(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/$$open_iscsi_module $$open_iscsi_mods_full_path"; \
	                done; \
	                tar czfP $(DESTDIR)/$(prefix)/backup/open_iscsi_ko-$(KVERSION).tgz $$open_iscsi_mods_full_path; \
	        fi; \
	        for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	        do \
	                (/bin/rm -f $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/$$open_iscsi_module ); \
	        done; \
	fi;

	# Copy new open-iscsi kernel modules to $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi     
	if [ -d $(CWD)/lib/modules/$(KVERSION)/scsi ]; then \
	        mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi; \
	        for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	        do \
	                (mv $(CWD)/lib/modules/$(KVERSION)/scsi/$$open_iscsi_module $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/ ); \
	        done; \
	fi; \
	if [ -d $(CWD)/lib/modules/$(KVERSION)/extra/drivers/scsi ]; then \
	        mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi; \
	        for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	        do \
	                (mv $(CWD)/lib/modules/$(KVERSION)/extra/drivers/scsi/$$open_iscsi_module $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/ ); \
	        done; \
	elif [ -d $(CWD)/lib/modules/$(KVERSION)/extra ]; then \
	        mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi; \
	        for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	        do \
	                (mv $(CWD)/lib/modules/$(KVERSION)/extra/$$open_iscsi_module $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/ ); \
	        done; \
	fi;
	
	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

install_kernel_cxgb3: install_modules
	# Backup original cxgb3.ko kernel module under 'prefix'/backup directory
	if [ -d $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3 ]; then \
		mkdir -p $(DESTDIR)/$(prefix)/backup; \
		if [ ! -f $(DESTDIR)/$(prefix)/backup/cxgb3_ko-$(KVERSION).tgz ]; then \
			tar czfP $(DESTDIR)/$(prefix)/backup/cxgb3_ko-$(KVERSION).tgz $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3/cxgb3.ko; \
		fi; \
		/bin/rm -f $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3/cxgb3.ko; \
	fi;

	# Copy new cxgb3 kernel module to $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3     
	if [ -d $(CWD)/lib/modules/$(KVERSION)/drivers/net/cxgb3 ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3; \
		mv $(CWD)/lib/modules/$(KVERSION)/drivers/net/cxgb3/cxgb3.ko $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3; \
	fi; \
	if [ -d $(CWD)/lib/modules/$(KVERSION)/extra/drivers/net/cxgb3 ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra/drivers/net/cxgb3/cxgb3.ko $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3/ ; \
	elif [ -d $(CWD)/lib/modules/$(KVERSION)/extra ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra/cxgb3.ko $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3/ ; \
	fi;
	
	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

install_kernel_rds: install_modules
	# Backup original rds.ko kernel module under 'prefix'/backup directory
	if [ -d $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds ]; then \
		mkdir -p $(DESTDIR)/$(prefix)/backup; \
		if [ ! -f $(DESTDIR)/$(prefix)/backup/rds_ko-$(KVERSION).tgz ]; then \
			tar czfP $(DESTDIR)/$(prefix)/backup/rds_ko-$(KVERSION).tgz $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds/rds.ko; \
		fi; \
		/bin/rm -f $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds/rds.ko; \
	fi;

	# Copy new rds kernel module to $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/rds     
	if [ -d $(CWD)/lib/modules/$(KVERSION)/kernel/net/rds ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds; \
		mv $(CWD)/lib/modules/$(KVERSION)/kernel/net/rds/rds.ko $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds; \
	fi; \
	if [ -d $(CWD)/lib/modules/$(KVERSION)/extra/net/rds ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra/net/rds/rds.ko $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds/ ; \
	elif [ -d $(CWD)/lib/modules/$(KVERSION)/extra ]; then \
		mkdir -p $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds; \
		mv $(CWD)/lib/modules/$(KVERSION)/extra/rds.ko $(DESTDIR)/$(MODULES_DIR)/kernel/net/rds/ ; \
	fi;
	
	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

clean: clean_kernel

clean_kernel:
	$(MAKE) -C $(KSRC) SUBDIRS="$(CWD)" KERNELRELEASE=$(KVERSION) EXTRAVERSION=$(EXTRAVERSION) $(WITH_MAKE_PARAMS) clean

uninstall_infiniband:
	if [ -f $(DESTDIR)/$(prefix)/backup/infiniband_ko-$(KVERSION).tgz ]; then \
		rm -rf $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/infiniband; \
		tar xzfP $(DESTDIR)/$(prefix)/backup/infiniband_ko-$(KVERSION).tgz; \
		/bin/rm -f $(DESTDIR)/$(prefix)/backup/infiniband_ko-$(KVERSION).tgz; \
	fi

uninstall_iscsi:
	if [ -f $(DESTDIR)/$(prefix)/backup/open_iscsi_ko-$(KVERSION).tgz ]; then \
	         for open_iscsi_module in $(OPEN_ISCSI_MODULES); \
	         do \
	                (/bin/rm $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/scsi/$$open_iscsi_module ); \
	         done; \
	         tar xzfP $(DESTDIR)/$(prefix)/backup/open_iscsi_ko-$(KVERSION).tgz; \
	         /bin/rm -f $(DESTDIR)/$(prefix)/backup/open_iscsi_ko-$(KVERSION).tgz; \
	fi;

	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

uninstall_cxgb3:
	if [ -f $(DESTDIR)/$(prefix)/backup/cxgb3_ko-$(KVERSION).tgz ]; then \
	         /bin/rm $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/cxgb3/cxgb3.ko ; \
	         tar xzfP $(DESTDIR)/$(prefix)/backup/cxgb3_ko-$(KVERSION).tgz; \
	         /bin/rm -f $(DESTDIR)/$(prefix)/backup/cxgb3_ko-$(KVERSION).tgz; \
	fi;

	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

uninstall_rds:
	if [ -f $(DESTDIR)/$(prefix)/backup/rds_ko-$(KVERSION).tgz ]; then \
	         /bin/rm $(DESTDIR)/$(MODULES_DIR)/kernel/drivers/net/rds/rds.ko ; \
	         tar xzfP $(DESTDIR)/$(prefix)/backup/rds_ko-$(KVERSION).tgz; \
	         /bin/rm -f $(DESTDIR)/$(prefix)/backup/rds_ko-$(KVERSION).tgz; \
	fi;

	if [ ! -n "$(DESTDIR)" ]; then $(DEPMOD) -r -ae $(KVERSION);fi;

help:
	@echo
	@echo kernel: 		        build kernel modules
	@echo all: 		        build kernel modules
	@echo
	@echo install_kernel:	        install kernel modules under $(DESTDIR)/$(MODULES_DIR)
	@echo install_kernel_infiniband:install kernel modules under $(DESTDIR)/$(MODULES_DIR)
	@echo install_kernel_iscsi:     install iSCSI kernel modules under $(DESTDIR)/$(MODULES_DIR)
	@echo install_kernel_cxgb3:    	install cxgb3 kernel module under $(DESTDIR)/$(MODULES_DIR)
	@echo install_kernel_rds:    	install rds kernel module under $(DESTDIR)/$(MODULES_DIR)
	@echo install:	        	run install_kernel
	@echo
	@echo clean:	        	delete kernel modules binaries
	@echo clean_kernel:	        delete kernel modules binaries
	@echo uninstall:        	delete installed environment
	@echo
